package br.unp.tasi.loja.controladores;

import br.unp.tasi.loja.entidades.Pedido;
import br.unp.tasi.loja.entidades.StatusPedido;
import br.unp.tasi.loja.entidades.Usuario;
import br.unp.tasi.loja.repositorios.RepositorioPedido;
import java.util.List;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * Controlador responsavel pelos pedidos
 * @author jfrank
 */
@Controller
@RequestMapping("/pedido")
public class ControladorPedido {

  private transient final Log log = LogFactory.getLog(ControladorPedido.class);
  @Inject
  RepositorioPedido repositorioPedido;

  /**
   * Lista o pedido do usuario
   * @param modelo
   * @param sessao
   * @return
   */
  @RequestMapping(value = "/listar", method = RequestMethod.GET)
  public String listar(Model modelo, HttpSession sessao) {
    Usuario usuario = (Usuario) sessao.getAttribute("usuario");
    if (usuario != null) {
      Pedido pedido = repositorioPedido.localizarPedidoAberto(usuario);
      modelo.addAttribute("pedido", pedido);
      return "pedido/listar";
    }
    return "redirect:/usuario/loginform.do";
  }

  /**
   * Adicionar item ao pedido
   * @param modelo
   * @return
   */
  @RequestMapping(value = "/adicionar", method = RequestMethod.GET)
  public String adicionar(Model modelo, HttpSession sessao, FormProdutoDetalhe formProdutoDetalhe) {
    Usuario usuario = (Usuario) sessao.getAttribute("usuario");
    if (usuario != null) {
      Long produto_id = formProdutoDetalhe.getProduto_id();
      Long quantidade = formProdutoDetalhe.getQuantidade();
      repositorioPedido.adicionarItem(usuario, produto_id, quantidade);
      return "redirect:/pedido/listar.do";
    }
    return "redirect:/usuario/loginform.do";
  }

  @RequestMapping(value = "/remover", method = RequestMethod.GET)
  public String remover(Model modelo, HttpSession sessao, @RequestParam("id") Long idItemPedido) {
    Usuario usuario = (Usuario) sessao.getAttribute("usuario");
    if (usuario != null) {
      Pedido pedido = repositorioPedido.localizarPedidoAberto(usuario);
      repositorioPedido.removerItemPedido(pedido, idItemPedido);
      return "redirect:/pedido/listar.do";
    }
    return "redirect:/usuario/loginform.do";
  }

  @RequestMapping(value = "/fechar", method = RequestMethod.GET)
  public String fechar(Model modelo, HttpSession sessao) {
    Usuario usuario = (Usuario) sessao.getAttribute("usuario");
    if (usuario != null) {
      Pedido pedido = repositorioPedido.localizarPedidoAberto(usuario);
      if (!pedido.getItens().isEmpty()) {
        pedido.setStatus(StatusPedido.FECHADO);
        repositorioPedido.gravar(pedido);
      }
      return "redirect:/pedido/listar.do";
    }
    return "redirect:/usuario/loginform.do";
  }

  /**
   * Retorna os pedidos anteriores do usuario
   * @param modelo
   * @param sessao
   * @return
   */
  @RequestMapping(value = "/anteriores", method = RequestMethod.GET)
  public String anteriores(Model modelo, HttpSession sessao) {
    Usuario usuario = (Usuario) sessao.getAttribute("usuario");
    if (usuario != null) {
      List<Pedido> pedidos = repositorioPedido.localizarPedidosAnteriores(usuario);
      modelo.addAttribute("pedidos", pedidos);
      return "pedido/anteriores";
    }
    return "redirect:/usuario/loginform.do";
  }
}
